// 高级功能演示

import { RedisToolkit } from '../src';

async function advancedFeaturesDemo() {
  console.log('🚀 开始高级功能演示...\n');

  // 创建Redis Toolkit实例
  const redis = new RedisToolkit({
    host: process.env['REDIS_HOST'] || 'localhost',
    port: parseInt(process.env['REDIS_PORT'] || '6379'),
    autoSerialize: true,
  });

  try {
    // 连接Redis
    await redis.connect();
    console.log('✅ Redis连接成功\n');

    // 1. 发布订阅功能演示（简化版本）
    console.log('📡 测试发布订阅功能...');

    // 发布消息（不需要订阅者）
    const subscriberCount = await redis.pubsub.publish('news-channel', {
      title: '重要新闻',
      content: 'Redis Toolkit发布新版本！',
      timestamp: new Date(),
    });
    console.log(`消息发布给 ${subscriberCount} 个订阅者`);

    // 获取活跃频道
    const activeChannels = await redis.pubsub.getActiveChannels();
    console.log('活跃频道数量:', activeChannels.length);

    console.log('✅ 发布订阅功能正常\n');

    // 2. 布隆过滤器功能演示
    console.log('🌸 测试布隆过滤器功能...');
    
    // 创建布隆过滤器（使用时间戳确保唯一性）
    const bloomName = `user-emails-${Date.now()}`;
    const bloomInfo = await redis.bloom.create(bloomName, {
      capacity: 10000,
      errorRate: 0.01,
    });
    console.log('布隆过滤器创建:', bloomInfo);

    // 添加元素
    const emails = [
      'user1@example.com',
      'user2@example.com',
      'user3@example.com',
      'admin@example.com',
    ];

    for (const email of emails) {
      const wasNew = await redis.bloom.add(bloomName, email);
      console.log(`添加邮箱 ${email}: ${wasNew ? '新增' : '已存在'}`);
    }

    // 检查元素
    const testEmails = [
      'user1@example.com',  // 应该存在
      'user4@example.com',  // 应该不存在
      'admin@example.com',  // 应该存在
      'test@example.com',   // 应该不存在
    ];

    for (const email of testEmails) {
      const mightExist = await redis.bloom.mightContain(bloomName, email);
      console.log(`邮箱 ${email}: ${mightExist ? '可能存在' : '肯定不存在'}`);
    }

    // 获取布隆过滤器信息
    const filterInfo = await redis.bloom.getInfo(bloomName);
    console.log('过滤器信息:', filterInfo);

    console.log('✅ 布隆过滤器功能正常\n');

    // 3. 安全功能演示
    console.log('🔒 测试安全功能...');
    
    // 加密存储敏感数据
    const sensitiveData = {
      creditCard: '1234-5678-9012-3456',
      ssn: '123-45-6789',
      password: 'super-secret-password',
    };

    await redis.security.setSecure('user:123:sensitive', sensitiveData, 3600);
    console.log('敏感数据已加密存储');

    // 读取加密数据
    const decryptedData = await redis.security.getSecure('user:123:sensitive');
    console.log('解密数据:', decryptedData);

    // 添加访问控制规则
    const ruleId = redis.security.addAccessRule({
      pattern: 'user:*:sensitive',
      permissions: ['read'],
      users: ['admin', 'user123'],
      roles: ['administrator'],
      enabled: true,
    });
    console.log('访问控制规则已添加:', ruleId);

    // 检查访问权限
    const hasAccess1 = redis.security.checkAccess('admin', 'user:123:sensitive', 'read');
    const hasAccess2 = redis.security.checkAccess('guest', 'user:123:sensitive', 'read');
    console.log('admin访问权限:', hasAccess1);
    console.log('guest访问权限:', hasAccess2);

    // 获取审计日志
    const auditLogs = redis.security.getAuditLogs({ limit: 5 });
    console.log('最近的审计日志:', auditLogs.length, '条');

    console.log('✅ 安全功能正常\n');

    // 4. 监控功能演示
    console.log('📊 测试监控功能...');
    
    // 开始监控
    await redis.monitoring.startMonitoring({
      metricsInterval: 5000,  // 5秒收集一次指标
      healthCheckInterval: 3000,  // 3秒检查一次健康状态
    });

    console.log('监控已启动，等待收集数据...');
    
    // 等待一段时间让监控收集数据
    await new Promise(resolve => setTimeout(resolve, 8000));

    // 获取性能指标
    const recentMetrics = redis.monitoring.getRecentMetrics(3);
    console.log('最近的性能指标:');
    recentMetrics.forEach((metric, index) => {
      console.log(`  ${index + 1}. 响应时间: ${metric.responseTime}ms, 内存: ${Math.round(metric.memoryUsage / 1024 / 1024)}MB`);
    });

    // 执行健康检查
    const healthCheck = await redis.monitoring.performHealthCheck();
    console.log('健康检查结果:', healthCheck.status);
    console.log('检查详情:', healthCheck.checks);
    console.log('性能指标:', {
      延迟: `${healthCheck.metrics.latency}ms`,
      内存使用: `${healthCheck.metrics.memoryUsage.toFixed(1)}%`,
      连接数: healthCheck.metrics.connectionCount,
      运行时间: `${Math.round(healthCheck.metrics.uptime / 1000)}秒`,
    });

    if (healthCheck.issues.length > 0) {
      console.log('发现问题:', healthCheck.issues);
    }

    // 添加自定义告警规则
    redis.monitoring.addAlertRule({
      name: 'demo_high_latency',
      metric: 'responseTime',
      operator: 'gt',
      threshold: 50, // 50ms
      duration: 10,
      enabled: true,
      severity: 'medium',
    });

    // 获取监控统计
    const monitoringStats = redis.monitoring.getStats();
    console.log('监控统计:', monitoringStats);

    // 停止监控
    redis.monitoring.stopMonitoring();
    console.log('✅ 监控功能正常\n');

    // 5. 综合统计信息
    console.log('📈 获取综合统计信息...');
    
    const [
      cacheStats,
      queueStats,
      bloomStats,
      securityStats,
    ] = await Promise.all([
      redis.cache.getStats(),
      redis.queue.getStats('default'),
      redis.bloom.getStats(),
      redis.security.getStats(),
    ]);

    console.log('缓存统计:', {
      命中率: `${(cacheStats.hitRate * 100).toFixed(1)}%`,
      总键数: cacheStats.totalKeys,
      内存使用: `${Math.round(cacheStats.totalMemory / 1024 / 1024)}MB`,
    });

    console.log('队列统计:', {
      等待中: queueStats.waiting,
      处理中: queueStats.active,
      已完成: queueStats.completed,
      失败: queueStats.failed,
    });

    console.log('布隆过滤器统计:', {
      过滤器数量: bloomStats.totalFilters,
      总元素数: bloomStats.totalElements,
      内存使用: `${Math.round(bloomStats.memoryUsage / 1024)}KB`,
    });

    console.log('安全统计:', {
      加密键数量: securityStats.totalEncryptedKeys,
      访问规则数: securityStats.totalAccessRules,
      审计日志数: securityStats.totalAuditLogs,
      失败访问次数: securityStats.failedAccessAttempts,
    });

    console.log('✅ 统计信息获取正常\n');

    // 6. 清理演示数据
    console.log('🧹 清理演示数据...');
    
    // 发布订阅无需特殊清理
    
    // 删除布隆过滤器
    await redis.bloom.delete(bloomName);
    
    // 清理安全数据
    await redis.cache.del('user:123:sensitive');
    
    console.log('✅ 清理完成\n');

    console.log('🎉 高级功能演示全部完成！');
    console.log('💡 Redis Toolkit提供了丰富的高级功能：');
    console.log('   📡 发布订阅 - 实时消息传递');
    console.log('   🌸 布隆过滤器 - 高效去重检测');
    console.log('   🔒 安全管理 - 数据加密和访问控制');
    console.log('   📊 监控系统 - 性能监控和健康检查');

  } catch (error) {
    console.error('❌ 高级功能演示失败:', error);
  } finally {
    // 确保清理资源
    try {
      await redis.pubsub.cleanup();
      redis.monitoring.stopMonitoring();
    } catch (error) {
      console.error('清理资源时出错:', error);
    }
    
    // 断开连接
    await redis.disconnect();
    console.log('📡 Redis连接已断开');
  }
}

// 运行演示
if (require.main === module) {
  advancedFeaturesDemo().catch(console.error);
}

export { advancedFeaturesDemo };
